/******************************************************************************* * Copyright (c) 2000, 2015 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation * James Blackburn (Broadcom Corp.) - Bug 294628 multiple selection *******************************************************************************/ package org.eclipse.ui.internal.registry; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExtensionRegistry; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.internal.dialogs.PropertyPageContributorManager; import org.eclipse.ui.internal.dialogs.RegistryPageContributor; /** * This class loads property pages from the registry. */ public class PropertyPagesRegistryReader extends CategorizedPageRegistryReader { /** * Value "<code>nameFilter</code>". */ public static final String ATT_NAME_FILTER = "nameFilter";//$NON-NLS-1$ /** * Value "<code>name</code>". */ public static final String ATT_FILTER_NAME = "name";//$NON-NLS-1$ /** * Value "<code>value</code>". */ public static final String ATT_FILTER_VALUE = "value";//$NON-NLS-1$ /** * Value "<code>selectionFilter</code>". Is an enum allowing propertyPages to * support multiple selection when enum value is <code>ATT_SELECTION_FILTER_MULTI</code> * @since 3.7 */ public static final String ATT_SELECTION_FILTER = "selectionFilter";//$NON-NLS-1$ /** * Selection filter attribute value indicating support for multiple selection. * @since 3.7 */ public static final String ATT_SELECTION_FILTER_MULTI = "multi";//$NON-NLS-1$ private static final String TAG_PAGE = "page";//$NON-NLS-1$ /** * Value "<code>filter</code>". */ public static final String TAG_FILTER = "filter";//$NON-NLS-1$ /** * Value "<code>keywordReference</code>". */ public static final String TAG_KEYWORD_REFERENCE = "keywordReference";//$NON-NLS-1$ /** * Value "<code>objectClass</code>". */ public static final String ATT_OBJECTCLASS = "objectClass";//$NON-NLS-1$ /** * Value "<code>adaptable</code>". */ public static final String ATT_ADAPTABLE = "adaptable";//$NON-NLS-1$ private static final String CHILD_ENABLED_WHEN = "enabledWhen"; //$NON-NLS-1$; private Collection pages = new ArrayList(); private PropertyPageContributorManager manager; class PropertyCategoryNode extends CategoryNode { RegistryPageContributor page; /** * Create a new category node on the given reader for the property page. * * @param reader * @param propertyPage */ PropertyCategoryNode(CategorizedPageRegistryReader reader, RegistryPageContributor propertyPage) { super(reader); page = propertyPage; } @Override String getLabelText() { return page.getPageName(); } @Override String getLabelText(Object element) { return ((RegistryPageContributor) element).getPageName(); } @Override Object getNode() { return page; } } /** * The constructor. * * @param manager * the manager */ public PropertyPagesRegistryReader(PropertyPageContributorManager manager) { this.manager = manager; } /** * Reads static property page specification. */ private void processPageElement(IConfigurationElement element) { String pageId = element .getAttribute(IWorkbenchRegistryConstants.ATT_ID); if (pageId == null) { logMissingAttribute(element, IWorkbenchRegistryConstants.ATT_ID); return; } RegistryPageContributor contributor = new RegistryPageContributor( pageId, element); String pageClassName = getClassValue(element, IWorkbenchRegistryConstants.ATT_CLASS); if (pageClassName == null) { logMissingAttribute(element, IWorkbenchRegistryConstants.ATT_CLASS); return; } if (element.getAttribute(ATT_OBJECTCLASS) == null) { pages.add(contributor); manager.registerContributor(contributor, Object.class.getName()); } else { List objectClassNames = new ArrayList(); objectClassNames.add(element.getAttribute(ATT_OBJECTCLASS)); registerContributors(contributor, objectClassNames); } } /** * Register the contributor for all of the relevant classes. * * @param contributor * @param objectClassNames */ private void registerContributors(RegistryPageContributor contributor, List objectClassNames) { pages.add(contributor); for (Iterator iter = objectClassNames.iterator(); iter.hasNext();) { manager.registerContributor(contributor, (String) iter.next()); } } /** * Reads the next contribution element. * * public for dynamic UI */ @Override public boolean readElement(IConfigurationElement element) { if (element.getName().equals(TAG_PAGE)) { processPageElement(element); readElementChildren(element); return true; } if (element.getName().equals(TAG_FILTER)) { return true; } if (element.getName().equals(CHILD_ENABLED_WHEN)) { return true; } if (element.getName().equals(TAG_KEYWORD_REFERENCE)) { return true; } return false; } /** * Reads all occurances of propertyPages extension in the registry. * * @param registry * the registry */ public void registerPropertyPages(IExtensionRegistry registry) { readRegistry(registry, PlatformUI.PLUGIN_ID, IWorkbenchRegistryConstants.PL_PROPERTY_PAGES); processNodes(); } @Override void add(Object parent, Object node) { ((RegistryPageContributor) parent) .addSubPage((RegistryPageContributor) node); } @Override CategoryNode createCategoryNode(CategorizedPageRegistryReader reader, Object object) { return new PropertyCategoryNode(reader, (RegistryPageContributor) object); } @Override Object findNode(Object parent, String currentToken) { return ((RegistryPageContributor) parent).getChild(currentToken); } @Override Object findNode(String id) { Iterator iterator = pages.iterator(); while (iterator.hasNext()) { RegistryPageContributor next = (RegistryPageContributor) iterator .next(); if (next.getPageId().equals(id)) return next; } return null; } @Override String getCategory(Object node) { return ((RegistryPageContributor) node).getCategory(); } @Override protected String invalidCategoryNodeMessage(CategoryNode categoryNode) { RegistryPageContributor rpc = (RegistryPageContributor) categoryNode.getNode(); return "Invalid property category path: " + rpc.getCategory() + " (bundle: " + rpc.getPluginId() + ", propertyPage: " + rpc.getLocalId() + ")"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ } @Override Collection getNodes() { return pages; } }